﻿#include<iostream>
#include"Collision.h"
#include"GLpoint.h"
using namespace std;
/*************************************************************************************/

//Sprawdza czy jest kolizja
bool Collision::CollisionDetection(void)
{
	bool colldet = false, nocoll = false;
	GLfloat v1[2], v2[2];
	GLfloat posx_new, posy_new, x, y;
	render.keystate = SDL_GetKeyState(NULL);
	posx_new = render.posx - render.speed*render.keystate[SDLK_LEFT] + render.speed*render.keystate[SDLK_RIGHT];
	posy_new = render.posy + render.speed*render.keystate[SDLK_UP] - render.speed*render.keystate[SDLK_DOWN];
	for(int n = 0; n < render.cubes.allcubes->numofcubes; n++)
	{
		for(int k = 1; k <= 100; k++) // przechodzenie po całym okregu - 100 punktów
		{
			for(int i = 0; i < 4; i++) //po wszystkich wierzchołkach cuba
			{
				int j = (i+1)%4;	//ze Sterny 
				x = posx_new + render.r * cos(k*2*PI/100.0f);	//obliczanie kolejnych wspołrzędnych - skrajne punkty koła - okrąg
				y = posy_new + render.r * sin(k*2*PI/100.0f);
				v1[0] = x - render.cubes.allcubes[n].vertices[i].x;	//wektor miedzy naszą postacią a i-tym wierzchołkiem
				v1[1] = y - render.cubes.allcubes[n].vertices[i].y;
				
				v2[0] = render.cubes.allcubes[n].vertices[j].x - render.cubes.allcubes[n].vertices[i].x;	//wektor miedzy i+1-szym wierzchołkiem a i-tym
				v2[1] = render.cubes.allcubes[n].vertices[j].y - render.cubes.allcubes[n].vertices[i].y;
				
				if(v2[0]*v1[1] - v2[1]*v1[0] <= 0.0f) //iloczyn wektorowy - jesli choc raz mniejszy od 0 to nie ma kolizji z danym punktem x,y
				{
					nocoll = true;	//nie ma kolizji z danym punktem
				}						
			}
			if(nocoll) nocoll = false;	//jesli nie ma to załóż że jest do sprawdzania przy kolejnych punktach na okręgu
			else
			{
				colldet = true;	//jeśli była kolizja z którymkolwiek punktem na okręgu to znaczy że kolizja wystąpiła
				return colldet;
			}
		}
	}
		
	colldet = false;	//jesli tu doszło to znaczy że nie ma kolizji
	return colldet;	
}

/*************************************************************************************/

void Collision::HandleEvents(void)
{
        bool pushed = false;
        SDL_Event ev;
        //SDL_EventState(SDL_KEYUP, SDL_IGNORE);

        while(SDL_PollEvent(&ev))
        {

                switch(ev.type)
                {
                case SDL_KEYDOWN:
				if(!CollisionDetection()){
					render.Keypress(&ev.key.keysym);
				}
				pushed = true;
				break;
                case SDL_KEYUP:
                        render.Keyrelease(&ev.key.keysym);
                        break;
                case SDL_QUIT:
                        render.isrunning = false;
                        break;
                }
			 //SDL_Delay(5);	//wait for some time
        }

	   //xxx tymczasowo zmiana prędkości
        if(!pushed && !CollisionDetection())     //tu te¿ poza SDL_KEYDOWN sprawdza naciniête klawisze, bo jak nie ma to s¹ ma³e problemy
        {
                render.keystate = SDL_GetKeyState(NULL);
                if(render.keystate[SDLK_LEFT]) render.posx-=render.speed;
                if(render.keystate[SDLK_RIGHT]) render.posx+=render.speed;
                if(render.keystate[SDLK_DOWN]) render.posy-=render.speed;
                if(render.keystate[SDLK_UP]) render.posy+=render.speed;
        }
	   SDL_Delay(5);	//wait for some time
}

/*************************************************************************************/